package com.ctl.jvm;

/**
 * <p>Title: 阿阿</p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2019</p>
 * <p>Company: www.ctl.com</p>
 *
 * @author ctl
 * @version 1.1
 * @date 2023-11-13 10:14
 */
import java.nio.ByteBuffer;

public class DirectByteBufferExample {
    /**
     * 堆外内存是指不在Java虚拟机管理的内存空间，一般使用Native Memory来实现。对于堆外内存的释放，需要手动调用释放方法。
     * 线程挂掉会导致该线程所占用的所有资源被操作系统回收，这可能包括该线程申请的堆外内存。但是，由于Java虚拟机并不管理堆外内存，
     * 因此操作系统回收该线程时并不会自动释放其所占用的堆外内存。因此，如果没有手动释放堆外内存，就会出现内存泄漏的情况。
     * 因此，在使用堆外内存时，建议在程序中显式地释放该内存，以避免内存泄漏问题。同时，可以考虑使用一些第三方的内存管理工具来协助管理堆外内存，
     * 例如Netty提供的ByteBuf池化机制。
     * {@link  ByteBufPoolExample}
     * @param args
     */
    public static void main(String[] args) {
        // 分配1MB的堆外内存
        ByteBuffer buffer = ByteBuffer.allocateDirect(1024 * 1024);

        // 向缓冲区中写入数据
        String message = "Hello, World!";
        buffer.put(message.getBytes());

        // 将缓冲区从写模式转换为读模式
        buffer.flip();

        // 从缓冲区中读取数据并打印
        byte[] result = new byte[buffer.remaining()];
        buffer.get(result);
        System.out.println(new String(result));

        // 释放缓冲区
        buffer.clear();
    }
}
